﻿/******************************************
 * 
 * @author Рамиль Алиякберов a.k.a R@Me0
 * http://www.rame0.ru
 *  
 * License:
 * Read License.txt
 */


using System;
using System.Windows.Browser;
using System.Windows.Threading;
using System.Collections.Generic;
using System.Xml.Linq;


namespace VKontakte
{
    public partial class APIConnection
    {
        #region App функции
        /*
         * TODO: Реализовать перечисленные методы
         * 
        public void execute();// - позволяет исполнять алгоритмы в API.
        public void getVariable();// – возвращает значение хранимой переменной.
        public void getMessages();// – возвращает список очереди сообщений.
        public void sendMessage();// – ставит сообщение в очередь.
        public void getServerTime();// – возвращает текущее время.
        public void getAds();// – возвращает рекламные объявления для показа пользователям.
        public void setNameInMenu();// – устанавливает короткое название приложения в левом меню, если пользователь добавил туда приложение.
         */

        /// <summary>
        /// Помещает в переменную, номер которой задан в параметре key (0-4095), значение, переданное в параметре value (строка в utf-8, не более 255 байтов). 
        /// </summary>
        /// Подробнее тут:
        /// http://vkontakte.ru/developers.php?o=-1&p=putVariable
        /// <param name="key">Ключ от 0 до 4095, идентификатор переменной.</param>
        /// <param name="value">Значение, которое нужно записать в переменную. Строка в utf-8, не более 255 байтов</param>
        /// <param name="dispatcher">Поток окна приложения, вызвавшего метод</param>
        /// <param name="callBack">Колбэк функция вызываемая завершении запроса</param>
        public void putVariable(int key, string value, Dispatcher dispatcher = null, ApiCallBackHandler<bool> callBack = null, ApiCallBackHandler<XDocument> errorCallBack = null)
        {
            DataProvider.AsyncApiResponse data = new DataProvider.AsyncApiResponse(PutVarHandler, dispatcher, callBack, errorCallBack);
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("key", Convert.ToString(key));
            parameters.Add("value", value);
            parameters.Add("user_id", GetId());
            dataProvider.Request("putVariable", data, parameters);
        }

        /// <summary>
        /// Возвращает значение переменной, номер которой задан в параметре key (0-4095). 
        /// </summary>
        /// Подробнее тут:
        /// http://vkontakte.ru/developers.php?o=-1&p=getVariable
        /// <param name="key">Ключ от 0 до 4095, идентификатор переменной.</param>
        /// <param name="dispatcher">Поток окна приложения, вызвавшего метод</param>
        /// <param name="callBack">Колбэк функция вызываемая завершении запроса</param>
        public void getVariable(int key, Dispatcher dispatcher, ApiCallBackHandler<Dictionary<int, string>> callBack, ApiCallBackHandler<XDocument> errorCallBack = null)
        {
            DataProvider.AsyncApiResponse data = new DataProvider.AsyncApiResponse(GetVarsHandler, dispatcher, callBack, errorCallBack);
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("key", Convert.ToString(key));
            parameters.Add("user_id", GetId());
            dataProvider.Request("getVariable", data, parameters);
        }

        /// <summary>
        /// Возвращает список значений диапазона переменных, заданного с помощью входных параметров key (номер первой переменной) 
        /// и count (число переменных). Данный метод позволяет получить за один запрос до 32 переменных. 
        /// </summary>
        /// Подробнее тут:
        /// http://vkontakte.ru/developers.php?o=-1&p=getVariables
        /// <param name="key">Ключ от 0 до 4095, идентификатор первой переменной.</param>
        /// <param name="dispatcher">Поток окна приложения, вызвавшего метод</param>
        /// <param name="callBack">Колбэк функция вызываемая завершении запроса</param>
        /// <param name="count">Значение от 1 до 32 - количество переменных.</param>
        public void getVariables(int key, Dispatcher dispatcher, ApiCallBackHandler<Dictionary<int, string>> callBack, int count = 1, ApiCallBackHandler<XDocument> errorCallBack = null)
        {
            DataProvider.AsyncApiResponse data = new DataProvider.AsyncApiResponse(GetVarsHandler, dispatcher, callBack, errorCallBack);
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("key", Convert.ToString(key));
            parameters.Add("count", Convert.ToString(count));
            parameters.Add("user_id", GetId());
            dataProvider.Request("getVariables", data, parameters);
        }

        /// <summary>
        /// Вместе с setUserScore использует глобальные переменные 16, 17 и 32 .. 32+max_scores-1 
        /// для организации глобальной таблицы рекордов, что удобно для полностью клиентских приложений-игр. 
        /// 
        /// getHighScores возвращает текущую таблицу рекордов. 
        /// Переменная 16 хранит текущее количество записей в таблице рекордов.
        /// Переменная 17 - максимальное количество записей в таблице рекордов (max_scores).
        /// Переменные, начиная с 32-й, хранят саму таблицу – каждая переменная содержит 
        /// три поля score, user_id и user_name, разделенные символом с кодом 31.
        /// </summary>
        /// Подробнее тут:
        /// http://vkontakte.ru/developers.php?o=-1&p=getHighScores
        /// <param name="dispatcher">Поток окна приложения, вызвавшего метод</param>
        /// <param name="callBack">Колбэк функция вызываемая завершении запроса</param>
        public void getHighScores(Dispatcher dispatcher, ApiCallBackHandler<List<Record>> callBack, ApiCallBackHandler<XDocument> errorCallBack = null)
        {
            DataProvider.AsyncApiResponse data = new DataProvider.AsyncApiResponse(GetHighScoresHandler, dispatcher, callBack, errorCallBack);
            dataProvider.Request("getHighScores", data);
        }

        /// <summary>
        /// Вместе с getHighScores использует глобальные переменные 16, 17 и 32 .. 32+max_scores-1 
        /// для организации глобальной таблицы рекордов, что удобно для полностью клиентских приложений-игр. 
        /// 
        /// setUserScore добавляет в таблицу результат текущего пользователя, переданный в
        /// параметре score. При этом новый результат добавляется в таблицу, а если она уже
        /// заполнена – вытесняет наименьший из имеющихся, если он меньше добавляемого. 
        /// 
        /// Переменная 16 хранит текущее количество записей в таблице рекордов.
        /// Переменная 17 - максимальное количество записей в таблице рекордов (max_scores).
        /// Переменные, начиная с 32-й, хранят саму таблицу – каждая переменная содержит
        /// три поля score, user_id и user_name, разделенные символом с кодом 31.
        /// </summary>
        /// Подробнее тут:
        /// http://vkontakte.ru/developers.php?o=-1&p=setUserScore
        /// <param name="score">рекорд пользователя для записи.</param>
        /// <param name="dispatcher">Поток окна приложения, вызвавшего метод</param>
        /// <param name="callBack">Колбэк функция вызываемая завершении запроса</param>
        public void setUserScore(int score, Dispatcher dispatcher = null, ApiCallBackHandler<bool> callBack = null, ApiCallBackHandler<XDocument> errorCallBack = null)
        {
            DataProvider.AsyncApiResponse data = new DataProvider.AsyncApiResponse(PutVarHandler, dispatcher, callBack, errorCallBack);
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("score", Convert.ToString(score));
            dataProvider.Request("setUserScore", data, parameters);
        }

        #endregion
    }
}
